package com.concurrent.sample.common.lock;

import com.concurrent.sample.common.redis.RedisCommonConsts;
import com.concurrent.sample.common.enums.ExpressionTypeEnum;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit;

@Target({ElementType.METHOD})
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface DistributedLock {

    /**
     * 默认分布式锁前缀
     * @return
     */
    String defaultPrefix() default RedisCommonConsts.DISTRIBUTED_LOCK_KEY;

    /**
     * 分布式锁 key 的表达式
     */
    String expression();

    /**
     * 分布式锁表达式类型
     * @return
     */
    ExpressionTypeEnum expressionType() default ExpressionTypeEnum.CONSTANT;

    /**
     * 表达式取参数的索引
     * @return
     */
    int expressionParamIndex() default 0;

    /**
     * 等待时长，为 0 时，不等待
     */
    long waitTime() default 30;

    /**
     * 过期时长，防止一直占用锁
     */
    long expireTime() default 30;

    /**
     * 过期时长单位
     */
    TimeUnit timeUnit() default TimeUnit.SECONDS;

}
